package code15.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test03 {

	public static void main(String[] args) {
//		System.out.println(879394 / 3);
//		System.out.println(293131 * 3);
		//splitFile("src/code15/io/Chrysanthemum.jpg", 5);
		
		//mergeFile("src/code15/io/Chrysanthemum.jpg_1");
	}

	/**
	 * 把一个大文件拆分为多个文件, 小文件的文件名是 原文件名 + "_" + 序号。<br>
	 * 例如: a.txt 分 3份 --> a.txt_1、a.txt_2、a.txt_3
	 * @param path 文件路径
	 * @param count 拆分的数量
	 */
	public static void splitFile(String path, int count) {
		File f = new File(path);
		if (f.isFile()) {
			// 总大小
			long total = f.length();
			// 计算平均每份的大小
			int length = (int) (total/count);
			System.out.println("平均每份的大小:"+length);
			if (length > 0) {
				try (
						FileInputStream fis = new FileInputStream(f);
						) {
					
					// 前面的数据
					int i = 1;
					for (; i <= (count-1); i++) {
						try (
								FileOutputStream fos = new FileOutputStream(
										new File(f.getParentFile(), f.getName() + "_" + i));
								) {
							// 一次读一份
							byte[] buffer = new byte[length];
							int len = fis.read(buffer);
							// 一份写入一个文件
							fos.write(buffer, 0, len);
						} catch (FileNotFoundException e) {
							e.printStackTrace();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
					// 最后的数据
					try (
							FileOutputStream fos = new FileOutputStream(
									new File(f.getParentFile(), f.getName() + "_" + i));
							) {
						byte[] buffer = new byte[1024];
						int len = -1;
						// 读取剩余内容, 全部写入最后一个小文件
						while ( (len = fis.read(buffer)) != -1 ) {
							fos.write(buffer, 0, len);
						}
					} catch (FileNotFoundException e) {
						e.printStackTrace();
					} catch (IOException e) {
						e.printStackTrace();
					}
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	/**
	 * 合并多个小文件为一个大文件, 大文件名 为 小文件名 去除 ("_" + 序号)。<br>
	 * 例如: a.txt_1、a.txt_2、a.txt_3、... 合并为 a.txt
	 * @param path 头文件的路径
	 */
	public static void mergeFile(String path) {
		File f = new File(path);
		if (f.isFile()) {
			String name = f.getName();
			// 获取大文件的名称
			String fileName = name.substring(0, name.lastIndexOf("_"));
			File destFile = new File(f.getParentFile(), "test_" + fileName);
			
			try (
					FileOutputStream fos = new FileOutputStream(destFile);
					) {
				int index = 1;
				while (f.isFile()) {// 有对应 序号的 小文件就读取其中内容
					try (
							FileInputStream fis = new FileInputStream(f);
							) {
						byte[] buffer = new byte[1024];
						int len = -1;
						// 读取当前小文件内容, 写入大文件
						while ( ( len = fis.read(buffer)) != -1 ) {
							fos.write(buffer, 0, len);
						}
						// 找下一个
						index++;
						f = new File(f.getParentFile(), fileName + "_" + index);
					} catch (IOException e) {
						e.printStackTrace();
						break;// 读取失败, 退出循环
					}
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
}
